package com.ruoyi.jihuo.service.handler;

import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.jihuo.domain.JhTmGoods;
import com.ruoyi.jihuo.domain.JhTmTemplate;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * @Author：LXY
 * @DATE：2025-09-14 11:17
 * @Description：图片处理器 - 根据模板设置的第三页图片设置条件 进行图片处理
 */
@Component
@Slf4j
public class Jh30ImageHandler implements PriorityHandler {
    @Override
    public int getPriority() {
        return 30;
    }

    /**
     * 处理商品图片信息
     * @param request 处理上下文，包含商品信息、模板配置和各类图片列表
     * @throws IOException 处理过程中出现的IO异常
     */
    @Override
    public boolean handle(ProcessContext<JSONObject> request) throws IOException {
        JSONObject data = request.getData();
        JhTmGoods item = data.getObject("item", JhTmGoods.class);
        JhTmTemplate template = data.getObject("template", JhTmTemplate.class);
        List<String> colorPic = data.getObject("colorPic", List.class);
        List<String> mainPic = data.getObject("mainPic", List.class);
        List<String> descPic = data.getObject("descPic", List.class);
        try {

            copyVideo(data, item, template.getJhIsCopyVideo());

            String jhMainImageSeq = template.getJhMainImageSeq();
            String jhIsFirstPictureReplace = template.getJhIsFirstPictureReplace();
            String jhIsOtherPictureReplace = template.getJhIsOtherPictureReplace();
            // 校验逻辑：如果存在 jhMainImageSeq，则不能有jhIsFirstPictureReplace和jhIsOtherPictureReplace
            if (StringUtils.isNotBlank(jhMainImageSeq) && (StringUtils.isNotBlank(jhIsFirstPictureReplace) || StringUtils.isNotBlank(jhIsOtherPictureReplace))) {
                throw new IllegalArgumentException("如果存在 jhMainImageSeq，则不能有 jhIsFirstPictureReplace 和 jhIsOtherPictureReplace, 请检查模板配置 " + template.getJhTemplateName());
            } else if (StringUtils.isNotBlank(jhMainImageSeq)) {
                changeMainImageSeq(mainPic, jhMainImageSeq);
            }

            String jhIsCopyColor = template.getJhIsCopyColor();
            if (!"1".equals(jhIsCopyColor)) {
                data.remove("colorPic");
            }

            changeDescImage(template, descPic);
        }catch (Exception e){
            request.setErrorInfo("图片处理时发生异常:"+e.getMessage());
            throw new RuntimeException("图片处理时发生异常:"+e);
        }
        return true;
    }

    /**
     * 处理商品详情图片
     * @param template 模板配置对象
     * @param descPic 详情图片列表
     */
    private void changeDescImage(JhTmTemplate template, List<String> descPic) {
        int jhPcTopNum = template.getJhPcTopNum();
        int jhPcBottomNum = template.getJhPcBottomNum();
        int jhPcReserveNum = template.getJhPcReserveNum();

        // 校验参数合法性
        if (jhPcTopNum < 0 || jhPcBottomNum < 0 || jhPcReserveNum < 0) {
            throw new IllegalArgumentException("图片处理参数不能为负数");
        }

        // 处理descPic列表
        if (descPic != null && !descPic.isEmpty()) {
            int totalSize = descPic.size();

            // 计算实际可保留的起始位置
            int startIdx = Math.min(jhPcTopNum, totalSize);
            // 计算实际可保留的结束位置
            int endIdx = Math.max(totalSize - jhPcBottomNum, startIdx);

            // 计算实际要保留的数量
            int actualReserveNum = Math.min(jhPcReserveNum, endIdx - startIdx);

            // 截取需要保留的部分
            List<String> reservedList = new ArrayList<>();
            for (int i = 0; i < actualReserveNum; i++) {
                reservedList.add(descPic.get(startIdx + i));
            }

            // 替换原列表
            descPic.clear();
            descPic.addAll(reservedList);

            String jhDescPrefix = template.getJhDescPrefix();
            String jhDescSuffix = template.getJhDescSuffix();

            // 在列表头尾插入前缀和后缀
            if (StringUtils.isNotBlank(jhDescPrefix)) {
                descPic.add(0, jhDescPrefix);
            }
            if (StringUtils.isNotBlank(jhDescSuffix)) {
                descPic.add(jhDescSuffix);
            }
        }
    }

    /**
     * 复制商品视频
     * @param data 数据上下文
     * @param item 商品信息
     * @param jhIsCopyVideo 是否复制视频的标识
     */
    private void copyVideo(JSONObject data, JhTmGoods item, String jhIsCopyVideo) {
        if ("是".equals(jhIsCopyVideo)) {
            data.put("video", item.getJhVideo());
        }
    }

    /**
     * 调整主图顺序
     * @param jhImages 主图列表
     * @param jhMainImageSeq 主图顺序配置字符串
     */
    private void changeMainImageSeq(List<String> jhImages, String jhMainImageSeq) {
        List<String> sortedImages = new ArrayList<>();

        // 根据jhMainImageSeq的顺序重新排列jhImages
        for (char c : jhMainImageSeq.toCharArray()) {
            int index = Character.getNumericValue(c) - 1; // 将字符转换为索引
            if (index >= 0 && index < jhImages.size()) {
                sortedImages.add(jhImages.get(index));
            }
        }
        jhImages.clear();
        jhImages.addAll(sortedImages);
    }
}